home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / tos / updates / update21.zoo / libg++ / iostest / hounddog.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-03  |  1.6 KB  |  62 lines

  1. #include <iostream.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. // Read either "dog", "hound", or "hounddog".
  6. // If "dog" is found, return 1.
  7. // If "hound" is found, return 2.
  8. // If "hounddog" is found, return 3.
  9. // If non of these are found, return -1.
  10. int my_scan(streambuf* sb)
  11. {
  12.     streammarker fence(sb);
  13.     char buffer[20];
  14.     // Try reading "hounddog":
  15.     if (sb->sgetn(buffer, 8) == 8 && strncmp(buffer, "hounddog", 8) == 0)
  16.       return 3;
  17.     // No, no "hounddog":  Backup to 'fence' ...
  18.     sb->seekmark(fence);
  19.     // ... and try reading "dog":
  20.     if (sb->sgetn(buffer, 3) == 3 && strncmp(buffer, "dog", 3) == 0)
  21.       return 1;
  22.     // No, no "dog" either:  Backup to 'fence' ...
  23.     sb->seekmark(fence);
  24.     // ... and try reading "hound":
  25.     if (sb->sgetn(buffer, 5) == 5 && strncmp(buffer, "hound", 5) == 0)
  26.       return 2;
  27.     // No, no "hound" either:  Backup to 'fence' and signal failure.
  28.     sb->seekmark(fence); // Backup to 'fence'..
  29.     return -1;
  30. }
  31.  
  32. int main(int argc, char **argv)
  33. {
  34.     streambuf *sb = cin.rdbuf();
  35.     if (argc > 1 && strncmp(argv[1], "-b", 2) == 0) {
  36.     streambuf *ret;
  37.     int buffer_size = atoi(&argv[1][2]);
  38.     if (buffer_size == 0)
  39.         ret = sb->setbuf(NULL, 0);
  40.     else
  41.         ret = sb->setbuf(new char[buffer_size], buffer_size);
  42.     if (ret != sb)
  43.         cerr << "Warning: cin.rdbuf()->setbuf failed!\n";
  44.     }
  45.     for (;;) {
  46.     int code = my_scan(sb);
  47.     int ch = sb->sbumpc();
  48.     if (code == -1 && ch == EOF)
  49.         break;
  50.     int n = 0;
  51.     while (ch != EOF && ch != '\n') {
  52.         n++;
  53.         ch = sb->sbumpc();
  54.     };
  55.     if (ch == EOF) {
  56.         cout << "[Unexpected EOF]\n";
  57.         break;
  58.     }
  59.     cout << "Code: " << code << " followed by " << n << " chars\n";
  60.     }
  61. }
  62.